// 数据响应式
/**
 * 在key发生变化时可以感知做出操作
 * @param {*} obj 对象
 * @param {*} key 需要拦截的key
 * @param {*} val 初始值
 */
function defineReactive(obj, key, val) {
  observer(val);
  Object.defineProperty(obj, key, {
    get() {
      console.log('get', key);
      return val
    },
    set(newVal) {
      console.log('set', newVal);
      if (newVal != val) {
        observer(newVal)
        val = newVal
      }
    }
  })
}
// 遍历obj做响应式
function observer(obj) {
  if(typeof obj !== 'object' || obj === null) {
    return
  }
  // 遍历obj的所有key做响应式
  Object.keys(obj).forEach(key => {
    defineReactive(obj, key, obj[key])
  })
}

function set(obj, key, val) {
  defineReactive(obj, key, val)
}



const obj = {
  foo: 'foo',
  bar: 'bar'
}
observer(obj)
// defineReactive(obj, 'foo', 'foo')
obj.foo;
obj.foo = 'foooooooo'
obj.bar
obj.bar = 'barrrrrrrr'
obj.bar = {
  a: 'asdfasdf'
}
obj.bar.a
// obj.dong = "dong"
set(obj, 'dong', 'dong')
obj.dong

